/*	
	Universidad: Universidad Nacional de Río Cuarto (UNRC)
	Materia: Taller de Diseño de Software (Cod. 3306)
	Carrera: Licenciatura en Ciencias de la Computación
	Proyecto 2011: Compilador de un subconjunto del lenguaje C (C--).
	Integrantes:
		Bettiol, Matías Nicolas.
		Mattana, Diego Leonel.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../includes/Cod3D.h"

// Retorna una nueva lista.
Cod3D openListaCodigo(){
	return NULL ;
}

// Retorna el 1er elemento de la lista de codigo de 3 direcciones.
TElemCodigo popCodigo(Cod3D *ctd){
    	TElemCodigo e;
   		e = (*ctd)->e;
		(*ctd) = (*ctd)->sig; 
		return e;
}

// Inserta un nuevo elemento en la lista.
// Retorna 0 si no se puede insertar.
int addCodigo3D(Cod3D *l , const TElemCodigo e){
	Cod3D nuevo;
	nuevo = malloc(sizeof(TElemCodigo));
	if(nuevo == NULL)
		return 1;
	nuevo->sig = (*l);
	nuevo->e = e;
	(*l) = nuevo;
	return 0;
}

// Retorna la lista  de codigo de 3 direcciones ordenada al reves.
Cod3D reversa(Cod3D l){
	Cod3D auxiliar = NULL;
	while(l != NULL){
			addCodigo3D(&auxiliar,popCodigo(&l));
	}
	return auxiliar;
}

// Imprime el elemento "e" de la lista.
void printTElemCodigo(const TElemCodigo e){
	if(strcmp(e.enumerado,"LABEL") == 0){
		printf("%s  %s%i  \n",e.enumerado,e.opUno->nombre,e.opUno->label);
	}
	else{		
		if(strcmp(e.enumerado,"JN") == 0){
			printf("%s  %s  %s%i \n",e.enumerado,e.opUno->nombre,e.opDos->nombre,e.opDos->label);
		}
		else{
			if(strcmp(e.enumerado,"JMP") == 0){
				printf("%s  %s%i  %s \n",e.enumerado,e.opUno->nombre,e.opUno->label,e.resultado->nombre);
			}
			else{
				if((strcmp(e.enumerado,"JB") == 0) || (strcmp(e.enumerado,"JC") == 0)){
					printf("%s  %s  %s%i \n",e.enumerado,e.opUno->nombre,e.opDos->nombre,e.opDos->label);
				}
				else{
					printf("%s  %s  %s  %s \n",e.enumerado,e.opUno->nombre,e.opDos->nombre,e.resultado->nombre);
				}
			}
		}
	}
}

// Imprime la lista de codigo intermedio.
void printListaCodigo(Cod3D l){
	Cod3D act;
	act = l;
	Cod3D auxiliar;
	int i = 0;
	if(l != NULL){
		printf("  %i ",i++);
		printTElemCodigo(act->e);
		while(act->sig != NULL){
			act = act->sig;
			printf("  %i ",i++);
			printTElemCodigo(act->e);
			addCodigo3D(&auxiliar,act->e);
   		}
	}
	printf("\n");
}
